class BufferCirculaire:
def __init__(self,capacite):
self.data = [None]*capacite
self.capacite = capacite
self.taille = 0
self.debut = 0
self.debut
.def i_physique(B,i_logique):
return B.debut + i_logique
On rend le buffer cyclique en calculant les indices physiques modulo la capacité.
def i_physique(B,i_logic):
return (B.debut + i_logic) % B.capacite
B = h.BufferDemo()
print("Capacité: ",B.capacite)
print("Taille: ",B.taille)
print("Début: ",B.debut)
print("Physique: ",B.data)
print("Logique: ",B)
Capacité: 6 Taille: 5 Début: 4 Physique: [4, 9, 16, None, 0, 1] Logique: 0 1 4 9 16
Pour insérer en queue, il faut écrire à l'indice logique B.taille
et incrémenter la taille
def inserer_en_queue(B,valeur):
if B.taille >= B.capacite:
raise Exception("")
B.data[i_physique(B,B.taille)] = valeur
B.taille += 1
Pour insérer en tête, il faut écrire à l'indice logique -1
, déplacer le debut
et incrémenter la taille
def inserer_en_tete(B,valeur):
if B.taille >= B.capacite:
raise Exception("")
B.debut = i_physique(B,-1)
B.data[B.debut] = valeur
B.taille += 1
B = BufferCirculaire(4)
print(B,B.data)
for i in range(4):
if i%2: inserer_en_queue(B,i)
else: inserer_en_tete(B,i)
print(B,B.data,B.debut)
[None, None, None, None] 0 [None, None, None, 0] 3 0 1 [1, None, None, 0] 3 2 0 1 [1, None, 2, 0] 2 2 0 1 3 [1, 3, 2, 0] 2
pour la suppression en tête,
debut
.def supprimer_en_queue(B):
if B.taille <= 0:
raise IndexError("")
B.data[i_physique(B,B.taille-1)] = None
B.taille -= 1
def supprimer_en_tete(B):
if B.taille <= 0:
raise IndexError("")
B.data[B.debut] = None
B.debut = i_physique(B,1)
B.taille -= 1
B = BufferCirculaire(3)
for i in range(2):
inserer_en_queue(B,2*i)
print(B,B.data,B.debut)
inserer_en_queue(B,2*i+1)
print(B,B.data,B.debut)
supprimer_en_tete(B)
print(B,B.data,B.debut)
0 [0, None, None] 0 0 1 [0, 1, None] 0 1 [None, 1, None] 1 1 2 [None, 1, 2] 1 1 2 3 [3, 1, 2] 1 2 3 [3, None, 2] 2
def getitem(B,i):
if i >= B.taille or i < 0:
raise IndexError("")
return B.data[i_physique(B,i)]
def setitem(B,i,valeur):
if i >= B.taille or i < 0:
raise IndexError("")
B.data[i_physique(B,i)] = valeur
def tete(B):
return getitem(B,0)
def queue(B):
return getitem(B,B.taille-1)
© Olivier Cuisenaire, 2018 |